在搜了一堆解釋, 還是非常混淆!
在測試、體會之後, 覺得應該這樣說會比較好!
野人獻曝, 希望幫助到您!
首先, 應該先了解:
-
working directory就是檔案系統下的資料夾, 不管是否接受 git 管理, 它就已經存在。
- git 所管理的內容, 都是working directory在某個時點的副本。
- 在檔案系統下, 你看到的是資料夾路徑與檔案; 在git管理的倉庫中, 檔案會另外複製、處理成snapshot.快照副本。
其中除了檔案原有的內容、路徑、修改時間等檔案資訊外, 還多了提交到git的時點、提交者等訊息(包裝成提交點)。
- 所以, working directory 的內容, 與 git 的內容, 並不是同一個物件!
提交時內容雖相同, 但本體在 working directory 內, 副本則在git內, 是不同的個體!
- 在working directory 的檔案, 通常會繼續修改; 但在 git 內的時間副本, 原則上是不能再改變的 (所以才稱為 snapshot.快照副本)!
- 然後, git 的內容, 就是 working directory 在不同時間點, 不斷提交、累積的副本所形成;
關鍵在於多了提交(時)點, 便可以構成其管理的儲存結構提交樹;
在提交樹的樹狀結構下, 從某個提交點開始回溯, 就可衍生出分支的概念!
- 反過來說, 在 git 內, working directory 內的同一個檔案, 可存在不同時點提交、不同內容的副本。
- 而 working tree 就是某提交點(通常也都是分支)回溯後、還原產生的整個專案內容!
- working tree 與 working directory 的專案內容會有差異? 可能! working tree 的內容可以不提交; 或提交後, 會繼續修改!
- 記得! workng tree 是從git管理的副本資料推演、還原出來的內容, 是該專案在某時間點(提交)的內容, 是鎖死不變的!
(但可以換不同的 workng tree!)
- 那麼, 是的! 原則上, working tree 可以有很多個! 但既然叫 working, 特別就是指 working directory 內正在使用的這一個 tree!
- 那, 又是哪一個? 在該 working directory 中, HEAD 指的那一個提交點(分支) 還原出來的專案內容就是了!
- 有人說 working tree 的位置, 就是 working directory! 簡單說, 是對的! 嚴格說, working directory 並不是 working tree!
-
working tree 是 git 用來與 working directory 比對、比較專案內容的, 是 git 管理的基礎!
- working tree 的實際內容, 是需要時, 從倉庫的提交樹中動態讀取出來, 不像 working directory 就放在資料夾內!
要點 |
working directory |
working tree |
定義 |
指當前的專案內容 |
git目前使用的專案副本內容 |
用途 |
實際儲存的區域 |
內容展開、編修等操作的區域 |
位置 |
實體上, 一般指專案資料夾 |
邏輯上, 位置與 working diretory 相同 |
內容(時點) |
當前、最新的專案內容 |
是某時點的專案內容(比對的基礎) |
實虛 |
是實體、真正存在 |
也是實體、真正存在, 但在Git管理下的副本 |
所以,
- working directory 與 working tree 是同一資料夾?
- 以資料夾位置來說, 並不算錯, 但位置不是關鍵
- 不同時點的專案內容, 才是重點, 也更容易分出差異
- 1 個 repository, 擁有多個 working tree?
- 是的, 大部分只用1個, 稱為 main working tree; 但可以有多個!
- 其實, 每個 working tree 一定會有 working directory, 因為是同一個資料夾內, 不同時點專案內容
- working tree 簡單來說, 就是由 HEAD 所展開的專案副本
- 若 working tree 的內容, 與 working directory 的內容相同, 就是 clean